/**
 * Created by jn-dinggao on 2017/7/12.
 */
var app = angular
    .module("myApp", [
        'ngResource',
        'ui.router',
        'ui.load',
        'ui.jq',
        'ui.bootstrap',
        'pascalprecht.translate',
        'ngCookies',
        'ngStorage',
        'oc.lazyLoad',
        'angularFileUpload',
        'oc.lazyLoad',
        'textAngular'
    ]);


app.factory('permissions', function ($rootScope,$cookieStore ,$localStorage ) {
        var permissionList;
        return {
            setPermissions:
                function(permissions) {
                    permissionList = permissions;
                    // $cookieStore.put("permissionList",permissionList);
                    $localStorage.permissionList = permissionList;
                    $rootScope.$broadcast('permissionsChanged')
                },
            hasPermission: function (permission) {
                permission = permission.trim();
                if(!permissionList){
                    permissionList = $localStorage.permissionList;
                }

                return permissionList.some(function(item) {
                    if(angular.isString(item.code))
                        return item.code.trim() === permission
                });
            }
        };
});

/**
 * 定义一个公司 factory
 */
app.factory('companyFactory',function ($localStorage) {
    var companyList;
    return {
        setAllCompany:function(allCompany){
            companyList = allCompany;
            $localStorage.companyList = companyList;
        },
        getAllCompany:function () {
            if(!companyList){
                companyList = $localStorage.companyList;
            }
            return companyList;
        }
    }
})

//利用$http服务创建与RESTful服务端数据资源进行交互
//定义 restAPI服务，服务中声明了query方法，返回promise
app.factory('restAPI',["$http","$q",function ($http,$q) {
       return{
           query : function() {
               var deferred = $q.defer(); // 声明延后执行，表示要去监控后面的执行
               $http({
                   method: 'GET',
                   url: 'http://localhost:8080/xpjssm/login',
                   params:{
                       userId:12,
                       password:123456
                   }
               }).
               success(function(data, status, headers, config) {
                   deferred.resolve(data);  // 声明执行成功，即http请求数据成功，可以返回数据了
               }).
               error(function(data, status, headers, config) {
                   deferred.reject(data);   // 声明执行失败，即服务器返回错误
               });
               return deferred.promise;   // 返回承诺，这里并不是最终数据，而是访问最终数据的API
           } //end query
       }
    }]);



//利用$resouce服务创建与RESTful服务端数据资源进行交互

// ACTIONS、METHODS是定义的全局变量
// $q 服务是AngularJS中自己封装实现的一种Promise实现
// $q 常用的方法
// defer() 创建一个deferred对象，这个对象可以执行几个常用的方法，比如resolve,reject,notify等
// all() 传入Promise的数组，批量执行，返回一个promise对象
// when() 传入一个不确定的参数，如果符合Promise标准，就返回一个promise对象。
//在Promise中，定义了三种状态：等待状态，完成状态，拒绝状态。
//Promise是一种异步方式处理值（或者非值）的方法，promise是对象，代表了一个函数最终可能的返回值或者抛出的异常。
app.factory('serviceUtil',function ($q,$resource,$cookieStore,ACTIONS,METHODS) {
    var factory = {};
    factory.excute = function (url,param,method) {
        var deferred = $q.defer();
        var promise = deferred.promise;
        var resource = $resource(url, param, ACTIONS);

        /*if( method != METHODS.login ){
            param.sessionId = $cookieStore.get("sessionId");
        }*/

        if(method == METHODS.login){
            //只有执行了register方法后才调用url ,resource.register(), register方法是ACTIONS中定义的。
            resource.register(param,function (data) {
                deferred.resolve(data);
            },function(error){
                deferred.reject(error);
            });
        }else if(method == METHODS.save){
            resource.save(param, function(data) {
                deferred.resolve(data);
            }, function(error) {
                deferred.reject(error);
            });
        }else if(method == METHODS.getCount){
            resource.getCount(param, function(data) {
                deferred.resolve(data);
            }, function(error) {
                deferred.reject(error);
            });
        }else if(method == METHODS.getList){
            resource.getList(param, function(data) {
                deferred.resolve(data);
            }, function(error) {
                deferred.reject(error);
            });
        }else if(method == METHODS.delete){
            resource.delete(param,function(data){
                deferred.resolve(data);
            }, function (error) {
                deferred.reject(error);
            })
        }else if(method == METHODS.get){
            resource.get(param,function(data){
                deferred.resolve(data);
            },function (error) {
                deferred.reject(error);
            })
        }else if(method == METHODS.update){
            resource.update(param,function(data){
                deferred.resolve(data);
            },function (error) {
                deferred.reject(error);
            })
        }
        return promise;
    }
    return factory;
});

/**
 * angularJs提供四种拦截器，其中两种成功拦截器（request、response），两种失败拦截器（requestError、responseError）
 * 通过实现 request 方法拦截请求
 * 通过实现 response 方法拦截响应
 * 通过实现 requestError 方法拦截请求异常
 * 通过实现 responseError 方法拦截响应异常
 */
app.factory('httpInterceptor', [ '$q', '$injector',function($q, $injector) {
    var httpInterceptor = {
        'responseError' : function(response) {
            if(response.status == 406){
                location.href = "./" //跳转到登录页
            }else if(response.status == 1001){
                Lobibox.alert("error",{
                    msg:'您尚未开通该权限！'
                });
            }
            return $q.reject(response);
        },
        'response' : function(response) {
            return response;
        },
        'request' : function(config) {
            return config;
        },
        'requestError' : function(config){
            return $q.reject(config);
        }
    }
    return httpInterceptor;
}]);




